package org.lsi.pl2.resnombres;

import java.util.LinkedList;
import java.util.List;

public class TablaSimbolos {
	
	public static final int ACCESO_ESTE_OBJETO = 0;
	public static final int ACCESO_SIMPLE = 1;
	public static final int TIPO_DECLARATIVO = 2;
	
	private List<ItemTablaSimbolos> accesoSimple;
	private List<ItemTablaSimbolos> accesoEsteObjeto;
	private List<String> tipos;
	private Ambito programa;
	
	public TablaSimbolos() {
		accesoSimple = new LinkedList<ItemTablaSimbolos>();
		accesoEsteObjeto = new LinkedList<ItemTablaSimbolos>();
		tipos = new LinkedList<String>();
	}
	
	public int addAccesoEsteObjeto(String ident, Ambito a) {
		int indice = accesoEsteObjeto.size();
		ItemTablaSimbolos item = new ItemTablaSimbolos();
		item.ident = ident;
		item.ambito = a;
		accesoEsteObjeto.add(indice,item);
		return indice;
	}
	
	public int addAccesoSimple(String ident, Ambito a) {
		int indice = accesoSimple.size();
		ItemTablaSimbolos item = new ItemTablaSimbolos();
		item.ident = ident;
		item.ambito = a;
		accesoSimple.add(indice,item);
		return indice;
	}
	
	public int addTipoDeclarativo(String ident) {
		int indice = tipos.size();
		tipos.add(indice, ident);
		return indice;
	}
	
	public Simbolo resuelveAccesoSimple(int indice) {
		ItemTablaSimbolos item = accesoSimple.get(indice);
		Simbolo simb = item.ambito.buscarDeclaracion(item.ident);
		return simb;
	}
	
	public Simbolo resuelveAccesoEsteObjeto(int indice) {
		ItemTablaSimbolos item = accesoEsteObjeto.get(indice);
		Simbolo simb = item.ambito.getContenedor().buscarDeclaracionEnEsteAmbito(item.ident);
		return simb;
	}
	
	public Simbolo resuelveTipoDeclarativo(int indice) {
		String clase = tipos.get(indice);
		Simbolo simb = programa.buscarDeclaracionEnEsteAmbito(clase);
		return simb;
	}
	
	public String getIdent(int lista, int posicion) {
		List l = null;
		String d = null;
		if (lista==ACCESO_ESTE_OBJETO) {
			l = accesoEsteObjeto;
		} else if (lista==ACCESO_SIMPLE) {
			l = accesoSimple;
		} else if (lista==TIPO_DECLARATIVO) {
			l = tipos;
			d = (String)l.get(posicion);
		}
		if (l!=null && d==null) {
			ItemTablaSimbolos item = (ItemTablaSimbolos)l.get(posicion);
			d = item.ident;
		}
		return d;
	}
	
	public Ambito getAmbito(int lista, int posicion) {
		List l = null;
		Ambito a = null;
		if (lista==ACCESO_ESTE_OBJETO) {
			l = accesoEsteObjeto;
		} else if (lista==ACCESO_SIMPLE) {
			l = accesoSimple;
		}
		if (l!=null) {
			ItemTablaSimbolos item = (ItemTablaSimbolos)l.get(posicion);
			a = item.ambito;
		}
		return a;
	}
	
	class ItemTablaSimbolos {
		private String ident;
		private Ambito ambito;
	}

	public Ambito getAmbitoPrograma() {
		return programa;
	}

	public void setPrograma(Ambito programa) {
		this.programa = programa;
	}
}
